package part1.chapter6_practice;

/**
 * Created by lie on 2018/3/9.
 * 现在尝试处理 有补中和全中的情况
 */
public class Game2 {
    private int score;

    public int getScore(){
//        return this.score;
        //这里隐藏一个bug，当只进行一次投掷的时候，这里的传参是1-1也就是0
        //所以分数是会有问题，但我们暂时不处理
        return getScoreByFrame(getCurrentFrame()-1);
    }

    //以下的代码虽然丑陋，不过功能是跑起来了
    //要处理的细节，就是作为下标的currentThrows什么时候应该移动
    //theThrows[currentThrows+1]表示下一次投掷的数量
    //theThrows[currentThrows++]也表示下一次投掷的数量，但是会将计数往后移
    public int getScoreByFrame(int frame){
        int score = 0;
        for (int currentThrows=0; frame> 0 ;frame--){

            int firstThrow = theThrows[currentThrows++];

            if (firstThrow == 10) {
                //全中，则分数是10+下2次
                score += 10 + theThrows[currentThrows] + theThrows[currentThrows+1];
            } else {
                int secondThrow = theThrows[currentThrows++];

                int frameScore = firstThrow + secondThrow;

                if (frameScore == 10) {
                    //补中，则分数是10+下1次
                    score += 10 + theThrows[currentThrows];//注意这里不是currentThrows++
                }else {
                    //普通操作
                    score += frameScore;
                }
            }
        }
        return score;
    }

    private int[] theThrows = new int[21];//21代表一场game里，可能的最多的投掷次数
    private int currentThrows = 0;
    private int currentFrame = 1;//当前格子，起手为1
    private boolean isFirstThrowInFrame = true;

    /**
     * 由于改了{@link #getScoreByFrame(int)}的计算
     * 这里也跟着改，以便能处理补中+全中的情况
     *
     * 初步设想是，直接调用
     * @see  #getScoreByFrame(int) 即可，那就需要
     * 一个currentFrame来传参了
     *
     * @see #calculateCurrentFrame(int)
     * @see #getCurrentFrame()
     *
     * @param balls
     */
    public void add(int balls){
        theThrows[currentThrows++] = balls;
        //初步设想是，直接调用getScoreByFrame即可
        //那就需要一个currentFrame来传参了
        calculateCurrentFrame(balls);
//        score += balls;
    }

    private void calculateCurrentFrame(int balls) {
        if (isFirstThrowInFrame) {
            if (balls == 10) {//全中，所以下一次frame仍然是FirstThrow
                this.currentFrame++;
            }else
                isFirstThrowInFrame = false;
        }else {
            isFirstThrowInFrame = true;
            this.currentFrame++;
        }

        // 限定最大的格子数
        currentFrame = Math.min(11, currentFrame);
    }

    public int getCurrentFrame(){
        return this.currentFrame;
    }
}
